package com.czr.frame.util.dao;

import java.util.Collection;
import java.util.List;
import java.util.Map;
import org.springframework.orm.hibernate3.HibernateTemplate;
/**
 * 
 * @author chenzhirong
 *
 */
public interface GenericDAO{

	/**
	 * <b>保存一条记录</b>
	 * @param entity		映射对象实体
	 */
	public void save(Object entity);
	
	/**
	 * <b>删除一个对象实体</b>
	 * @param entity		映射对象实体
	 */
	public void delete(Object entity);
	
	/**
	 * <b>更新一条记录</b>
	 * @param entity		映射对象实体
	 */
	public void update(Object entity);
	
	/**
	 * <b>批量新增</b>
	 * @param entities		映射对象集合实体
	 */
	public void bacthInsert(Collection<?> entities);
	
	/**
	 * <b>批量删除</b>
	 * @param entities		映射对象集合实体
	 */
	public void bacthDelete(Collection<?> entities);
		
	/**
	 * <b>批量修改</b>
	 * @param entities		映射对象集合实体
	 */
	public void bacthUpdate(Collection<?> entities);
	
	/**
	 * <b>保存一条新的记录或者跟新一条新的记录</b>
	 * <strong>不受权限控制</strong>
	 * @param entity		映射对象实体
	 */
	public void saveOrUpdate(Object entity);
	
	/**
	 * <b>批量保存或修改记录</b>
	 * <strong>不受权限控制</strong>
	 * @param entities		映射对象集合实体
	 */
	public void bacthSaveOrUpdate(Collection<?> entities);
	/**
	 * <b>移动:改变实体(权限对象)逻辑父类</b>
	 * @param entity		映射对象集合实体
	 */
	public void move(Object entity);
	/**
	 * <b>批量移动</b>
	 * @param entities		映射对象集合实体
	 */
	public void bacthMove(Collection<?> entities);

	/**
	 * <b>根据Hibernate映射对象id获得一个对象</b>
	 * @param entityClass	映射对象(???.class)
	 * @param id			对象主键
	 * @return 实体对象
	 */
	public <T> T findById(Class<T> entityClass,Object id);

	/**
	 * <b>根据映射对象查询出所有的实体对象集合</b>
	 * @param entityClass	映射对象(???.class)
	 * @return 返回一个对象实体的集合
	 */
	public List<Object> findAll(Class<?> entityClass);

	/**
	 * <b>不带参数的HQL查询</b>
	 * @param hql			Hibernate查询语言
	 * @return 对象集合
	 */
	public List<Object> queryHql(String hql);

	/**
	 * <b>返回结果集为Map的不带参数的HQL查询</b>
	 * (在查询语句带select ?? from 下生效,且不能为select *)
	 * <strong>不受权限控制</strong>
	 * @param hql			Hibernate查询语言
	 * @return MAP集合
	 */
	public List<Map<?,?>> queryHqlResultMap(String hql);

	/**
	 * <b>返回结果为单个对象或者null的不带参数的HQL查询</b>
	 * @param hql			Hibernate查询语言
	 * @return 单个对象或者null
	 */
	public Object queryHqlResultSingle(String hql);

	/**
	 * <b>返回结果为单个Map对象或者null的不带参数的HQL查询</b>
	 * <strong>不受权限控制</strong>
	 * @param hql			Hibernate查询语言
	 * @return 单个Map对象或者null
	 */
	public Map<?,?> queryHqlResultSingleMap(String hql);

	/**
	 * <b>不带参数的HQL数据分段查询</b>
	 * @param hql			Hibernate查询语言
	 * @param start			从第几条数据开始读取
	 * @param count			一共读取多少条,0为读取所有数据
	 * @return 对象集合
	 */
	public List<Object> queryHqlPart(String hql,int start,int count);
	
	/**
	 * <b>返回结果集为Map的不带参数的HQL数据分段查询</b>
	 * (在查询语句带select ?? from 下生效,且不能为select *)
	 * @param hql			Hibernate查询语言
	 * @param start			从第几条数据开始读取
	 * @param count			一共读取多少条,0为读取所有数据
	 * @return MAP集合
	 */
	public List<Map<?,?>> queryHqlPartResultMap(String hql,int start,int count);

	/**
	 * <b>带(键值对)参数的HQL查询</b>
	 * @param hql			带查询条件的HQL查询(命名参数)
	 * @param param			查询中用到的参数(键值对)
	 * @return 对象集合
	 */
	public List<Object> queryHqlMap(String hql,Map<String,Object> param);

	/**
	 * <b>返回结果集为Map的带(键值对)参数的HQL查询</b>
	 * (在查询语句带select ?? from 下生效,且不能为select *)
	 * @param hql			带查询条件的HQL查询(命名参数)
	 * @param param			查询中用到的参数(键值对)
	 * @return MAP集合
	 */
	public List<Map<?,?>> queryHqlMapResultMap(String hql,Map<String,Object> param);

	/**
	 * <b>返回结果为单个对象或者null的带(键值对)参数的HQL查询</b>
	 * @param hql			带查询条件的HQL查询(命名参数)
	 * @param param			查询中用到的参数(键值对)
	 * @return 单个对象或者null
	 */
	public Object queryHqlMapResultSingle(String hql,Map<String,Object> param);

	/**
	 * <b>返回结果为单个Map对象或者null的带(键值对)参数的HQL查询</b>
	 * @param hql			带查询条件的HQL查询(命名参数)
	 * @param param			查询中用到的参数(键值对)
	 * @return 单个Map对象或者null
	 */
	public Map<?,?> queryHqlMapResultSingleMap(String hql,Map<String,Object> param);

	/**
	 * <b>带(键值对)参数的HQL数据分段查询</b>
	 * @param hql			带查询条件的HQL查询(命名参数)
	 * @param start			从第几条数据开始读取
	 * @param count			一共读取多少条,0为读取所有数据
	 * @param param			查询中用到的参数(键值对)
	 * @return 对象集合
	 */
	public List<Object> queryHqlMapPart(String hql,int start,int count,Map<String,Object> param);

	/**
	 * <b>返回结果集为Map的带(键值对)参数的HQL数据分段查询</b>
	 * (在查询语句带select ?? from 下生效,且不能为select *)
	 * @param hql			带查询条件的HQL查询(命名参数)
	 * @param start			从第几条数据开始读取
	 * @param count			一共读取多少条,0为读取所有数据
	 * @param param			查询中用到的参数(键值对)
	 * @return MAP集合
	 */
	public List<Map<?,?>> queryHqlMapPartResultMap(String hql,int start,int count,Map<String,Object> param);

	/**
	 * <b>带(对象列表)参数的HQL查询</b>
	 * @param hql			带查询条件的HQL查询(位置参数)
	 * @param param			查询中用到的参数(对象列表)
	 * @return 对象集合
	 */
	public List<Object> queryHqlList(String hql,List<Object> param);

	/**
	 * <b>返回结果集为Map的带(对象列表)参数的HQL查询</b>
	 * (在查询语句带select ?? from 下生效,且不能为select *)
	 * @param hql			带查询条件的HQL查询(位置参数)
	 * @param param			查询中用到的参数(对象列表)
	 * @return MAP集合
	 */
	public List<Map<?,?>> queryHqlListResultMap(String hql,List<Object> param);

	/**
	 * <b>返回结果为单个对象或者null的带(对象列表)参数的HQL查询</b>
	 * @param hql			带查询条件的HQL查询(位置参数)
	 * @param param			查询中用到的参数(对象列表)
	 * @return 单个对象或者null
	 */
	public Object queryHqlListResultSingle(String hql,List<Object> param);

	/**
	 * <b>返回结果为单个Map对象或者null的带(对象列表)参数的HQL查询</b>
	 * @param hql			带查询条件的HQL查询(位置参数)
	 * @param param			查询中用到的参数(对象列表)
	 * @return 单个Map对象或者null
	 */
	public Map<?,?> queryHqlListResultSingleMap(String hql,List<Object> param);

	/**
	 * <b>带(对象列表)参数的HQL数据分段查询</b>
	 * @param hql			带查询条件的HQL查询(位置参数)
	 * @param start			从第几条数据开始读取
	 * @param count			一共读取多少条,0为读取所有数据
	 * @param param			查询中用到的参数(对象列表)
	 * @return 对象集合
	 */
	public List<Object> queryHqlListPart(String hql,int start,int count,List<Object> param);

	/**
	 * <b>返回结果集为Map的带(对象列表)参数的HQL数据分段查询</b>
	 * (在查询语句带select ?? from 下生效,且不能为select *)
	 * @param hql			带查询条件的HQL查询(位置参数)
	 * @param start			从第几条数据开始读取
	 * @param count			一共读取多少条,0为读取所有数据
	 * @param param			查询中用到的参数(对象列表)
	 * @return MAP集合
	 */
	public List<Map<?,?>> queryHqlListPartResultMap(String hql,int start,int count,List<Object> param);
	
	/**
	 * <b>带(可变参数<对象>)参数的HQL查询</b>
	 * @param hql			带查询条件的HQL查询(位置参数)
	 * @param params		查询中用到的参数(可变参数<对象>)
	 * @return 对象集合
	 */
	public List<Object> queryHqlVarargs(String hql,Object... params);

	/**
	 * <b>返回结果集为Map的带(可变参数<对象>)参数的HQL查询</b>
	 * (在查询语句带select ?? from 下生效,且不能为select *)
	 * @param hql			带查询条件的HQL查询(位置参数)
	 * @param params		查询中用到的参数(可变参数<对象>)
	 * @return MAP集合
	 */
	public List<Map<?,?>> queryHqlVarargsResultMap(String hql,Object... params);

	/**
	 * <b>返回结果为单个对象或者null的带(可变参数<对象>)参数的HQL查询</b>
	 * @param hql			带查询条件的HQL查询(位置参数)
	 * @param params		查询中用到的参数(可变参数<对象>)
	 * @return 单个对象或者null
	 */
	public Object queryHqlVarargsResultSingle(String hql,Object... params);

	/**
	 * <b>返回结果为单个Map对象或者null的带(可变参数<对象>)参数的HQL查询</b>
	 * @param hql			带查询条件的HQL查询(位置参数)
	 * @param params		查询中用到的参数(可变参数<对象>)
	 * @return 单个Map对象或者null
	 */
	public Map<?,?> queryHqlVarargsResultSingleMap(String hql,Object... params);

	/**
	 * <b>带(可变参数<对象>)参数的HQL数据分段查询</b>
	 * @param hql			带查询条件的HQL查询(位置参数)
	 * @param start			从第几条数据开始读取
	 * @param count			一共读取多少条,0为读取所有数据
	 * @param params		查询中用到的参数(可变参数<对象>)
	 * @return 对象集合
	 */
	public List<Object> queryHqlVarargsPart(String hql,int start,int count,Object... params);

	/**
	 * <b>返回结果集为Map的带(可变参数<对象>)参数的HQL数据分段查询</b>
	 * (在查询语句带select ?? from 下生效,且不能为select *)
	 * @param hql			带查询条件的HQL查询(位置参数)
	 * @param start			从第几条数据开始读取
	 * @param count			一共读取多少条,0为读取所有数据
	 * @param params		查询中用到的参数(可变参数<对象>)
	 * @return MAP集合
	 */
	public List<Map<?,?>> queryHqlVarargsPartResultMap(String hql,int start,int count,Object... params);

	/**
	 * <b>不带参数的SQL查询</b>
	 * @param sql			结构化查询语言
	 * @return 对象集合
	 */
	public List<Object> querySql(String sql);
	
	/**
	 * <b>返回结果集为Map的不带参数的SQL查询</b>
	 * @param sql			结构化查询语言
	 * @return MAP集合
	 */
	public List<Map<?,?>> querySqlResultMap(String sql);
	
	/**
	 * <b>返回结果为单个对象或者null的不带参数的SQL查询</b>
	 * @param sql			结构化查询语言
	 * @return 单个对象或者null
	 */
	public Object querySqlResultSingle(String sql);

	/**
	 * <b>返回结果为单个Map对象或者null的不带参数的SQL查询</b>
	 * @param sql			结构化查询语言
	 * @return 单个Map对象或者null
	 */
	public Map<?,?> querySqlResultSingleMap(String sql);	
	
	/**
	 * <b>不带参数的SQL数据分段查询</b>
	 * @param sql			结构化查询语言
	 * @param start			从第几条数据开始读取
	 * @param count			一共读取多少条,0为读取所有数据
	 * @return 对象集合
	 */
	public List<Object> querySqlPart(String sql,int start,int count);

	/**
	 * <b>返回结果集为Map的不带参数的SQL数据分段查询</b>
	 * @param sql			结构化查询语言
	 * @param start			从第几条数据开始读取
	 * @param count			一共读取多少条,0为读取所有数据
	 * @return MAP集合
	 */
	public List<Map<?,?>> querySqlPartResultMap(String sql,int start,int count);

	/**
	 * <b>带(键值对)参数的SQL查询</b>
	 * @param sql			带查询条件的结构化查询语言(命名参数)
	 * @param param			查询中用到的参数(键值对)
	 * @return 对象集合
	 */
	public List<Object> querySqlMap(String sql,Map<String,Object> param);

	/**
	 * <b>返回结果集为Map的带(键值对)参数的SQL查询</b>
	 * @param sql			带查询条件的结构化查询语言(命名参数)
	 * @param param			查询中用到的参数(键值对)
	 * @return MAP集合
	 */
	public List<Map<?,?>> querySqlMapResultMap(String sql,Map<String,Object> param);

	/**
	 * <b>返回结果为单个对象或者null的带(键值对)参数的SQL查询</b>
	 * @param sql			带查询条件的结构化查询语言(命名参数)
	 * @param param			查询中用到的参数(键值对)
	 * @return 单个对象或者null
	 */
	public Object querySqlMapResultSingle(String sql,Map<String,Object> param);

	/**
	 * <b>返回结果为单个对象或者null的带(键值对)参数的SQL查询</b>
	 * @param sql			带查询条件的结构化查询语言(命名参数)
	 * @param param			查询中用到的参数(键值对)
	 * @return 单个Map对象或者null
	 */
	public Map<?,?> querySqlMapResultSingleMap(String sql,Map<String,Object> param);
	
	/**
	 * <b>带(键值对)参数的SQL数据分段查询</b>
	 * @param sql			带查询条件的结构化查询语言(命名参数)
	 * @param start			从第几条数据开始读取
	 * @param count			一共读取多少条,0为读取所有数据
	 * @param param			查询中用到的参数(键值对)
	 * @return 对象集合
	 */
	public List<Object> querySqlMapPart(String sql,int start,int count,Map<String,Object> param);

	/**
	 * <b>返回结果集为Map的带(键值对)参数的SQL数据分段查询</b>
	 * @param sql			带查询条件的结构化查询语言(命名参数)
	 * @param start			从第几条数据开始读取
	 * @param count			一共读取多少条,0为读取所有数据
	 * @param param			查询中用到的参数(键值对)
	 * @return MAP集合
	 */
	public List<Map<?,?>> querySqlMapPartResultMap(String sql,int start,int count,Map<String,Object> param);

	/**
	 * <b>带(对象列表)参数的SQL查询</b>
	 * @param sql			带查询条件的结构化查询语言(位置参数)
	 * @param param			查询中用到的参数(对象列表)
	 * @return 对象集合
	 */
	public List<Object> querySqlList(String sql,List<Object> param);

	/**
	 * <b>返回结果集为Map的带(对象列表)参数的SQL查询</b>
	 * @param sql			带查询条件的结构化查询语言(位置参数)
	 * @param param			查询中用到的参数(对象列表)
	 * @return MAP集合
	 */
	public List<Map<?,?>> querySqlListResultMap(String sql,List<Object> param);

	/**
	 * <b>返回结果集为单个对象或者null的带(对象列表)参数的SQL查询</b>
	 * @param sql			带查询条件的结构化查询语言(位置参数)
	 * @param param			查询中用到的参数(对象列表)
	 * @return 单个对象或者null
	 */
	public Object querySqlListResultSingle(String sql,List<Object> param);

	/**
	 * <b>返回结果为单个Map对象或者null的带(对象列表)参数的SQL查询</b>
	 * @param sql			带查询条件的结构化查询语言(位置参数)
	 * @param param			查询中用到的参数(对象列表)
	 * @return 单个Map对象或者null
	 */
	public Map<?,?> querySqlListResultSingleMap(String sql,List<Object> param);
	
	/**
	 * <b>带(对象列表)参数的SQL数据分段查询</b>
	 * @param sql			带查询条件的结构化查询语言(位置参数)
	 * @param start			从第几条数据开始读取
	 * @param count			一共读取多少条,0为读取所有数据
	 * @param param			查询中用到的参数(对象列表)
	 * @return 对象集合
	 */
	public List<Object> querySqlListPart(String sql,int start,int count,List<Object> param);
	
	/**
	 * <b>返回结果集为Map的带(对象列表)参数的SQL数据分段查询</b>
	 * @param sql			带查询条件的结构化查询语言(位置参数)
	 * @param start			从第几条数据开始读取
	 * @param count			一共读取多少条,0为读取所有数据
	 * @param param			查询中用到的参数(对象列表)
	 * @return MAP集合
	 */
	public List<Map<?,?>> querySqlListPartResultMap(String sql,int start,int count,List<Object> param);

	/**
	 * <b>带(可变参数<对象>)参数的SQL查询</b>
	 * @param sql			带查询条件的结构化查询语言(位置参数)
	 * @param params		查询中用到的参数(可变参数<对象>)
	 * @return 对象集合
	 */
	public List<Object> querySqlVarargs(String sql,Object... params);

	/**
	 * <b>返回结果集为Map的带(可变参数<对象>)参数的SQL查询</b>
	 * @param sql			带查询条件的结构化查询语言(位置参数)
	 * @param params		查询中用到的参数(可变参数<对象>)
	 * @return MAP集合
	 */
	public List<Map<?,?>> querySqlVarargsResultMap(String sql,Object... params);

	/**
	 * <b>返回结果为单个对象或者null的带(可变参数<对象>)参数的SQL查询</b>
	 * @param sql			带查询条件的结构化查询语言(位置参数)
	 * @param params		查询中用到的参数(可变参数<对象>)
	 * @return 单个对象或者null
	 */
	public Object querySqlVarargsResultSingle(String sql,Object... params);

	/**
	 * <b>返回结果为单个Map对象或者null的带(可变参数<对象>)参数的SQL查询</b>
	 * @param sql			带查询条件的结构化查询语言(位置参数)
	 * @param params		查询中用到的参数(可变参数<对象>)
	 * @return 单个Map对象或者null
	 */
	public Map<?,?> querySqlVarargsResultSingleMap(String sql,Object... params);

	/**
	 * <b>带(可变参数<对象>)参数的SQL数据分段查询</b>
	 * @param sql			带查询条件的结构化查询语言(位置参数)
	 * @param start			从第几条数据开始读取
	 * @param count			一共读取多少条,0为读取所有数据
	 * @param params		查询中用到的参数(可变参数<对象>)
	 * @return 对象集合
	 */
	public List<Object> querySqlVarargsPart(String sql,int start,int count,Object... params);

	
	/**
	 * <b>返回结果集为Map的带(可变参数<对象>)参数的SQL数据分段查询</b>
	 * @param sql			带查询条件的结构化查询语言(位置参数)
	 * @param start			从第几条数据开始读取
	 * @param count			一共读取多少条,0为读取所有数据
	 * @param params		查询中用到的参数(可变参数<对象>)
	 * @return MAP集合
	 */
	public List<Map<?,?>> querySqlVarargsPartResultMap(String sql,int start,int count,Object... params);
	
	/**
	 * <b>执行删除或修改语句</b>
	 * @param hql /sql		执行语句
	 * @param isHql			是否是 Hibernate语言
	 */
	public int executeDelOrUpdate(String hql,boolean isHql);

	/**
	 * <b>带(键值对)参数的执行删除或修改语句</b>
	 * @param hql /sql		带参数的执行语句(命名参数)
	 * @param isHql			是否是 Hibernate语言
	 * @param param			执行语句中用到的参数(键值对)
	 */
	public int executeDelOrUpdate(String hql,boolean isHql,Map<String,Object> param);
	
	/**
	 * <b>带(对象列表)参数的执行删除或修改语句</b>
	 * @param hql /sql		带参数的执行语句(位置参数)
	 * @param isHql			是否是 Hibernate语言
	 * @param param			执行语句中用到的参数(对象列表)
	 */
	public int executeDelOrUpdate(String hql,boolean isHql,List<Object> param);

	/**
	 * <b>带(可变参数<对象>)参数的执行删除或修改语句</b>
	 * @param hql /sql		带参数的执行语句(位置参数)
	 * @param isHql			是否是 Hibernate语言
	 * @param params		执行语句中用到的参数(可变参数<对象>)
	 */
	public int executeDelOrUpdateVarargs(String hql,boolean isHql,Object... params);

	/**
	 * <b>获得Hibernate数据库原始数据库操作对象</b>
	 * <li><font color=red>为特殊情况预留,不建议使用</font>
	 * @return HibernateTemplate
	 */
	@Deprecated
	public HibernateTemplate getHibernateTemplate();
}